
package com.x52im.mall.logic.shop;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.eva.framework.dto.DataFromClient;
import com.eva.framework.dto.DataFromServer;
import com.eva.framework.dto.SysActionConst;
import com.x52im.mall.dto.CommonProcessorConst;
import com.x52im.mall.shop.dto.JobDispatchConst;
import com.x52im.mall.shop.dto.SO;
import com.x52im.rbchat.R;
import com.x52im.mall.MallGlobal;
import com.x52im.mall.Utility;
import com.eva.android.AutoUpdateDaemon;
import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.widget.DataLoadingAsyncTask;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.WidgetUtils.ToastType;

/**
 * 订单确认Activity实现类.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
// 说明：此界面中不能放“购物车”按钮的目的是，当进入购物车修改了产品数量后，再回到
// 本界面里，商品数据因没有回调刷新就不一致了，而回调刷新又有点麻烦，所以干脆本界面就不能进入购物车算了！
public class OrderComfirmActivity extends DataLoadableActivity 
{
//	private final static String TAG = OrderComfirmActivity.class.getSimpleName();
	
	/** Intent request codes: 填写收货信息Activity的回调请求码常量 */
	public final static int REQUEST_INPUT_CONSIGNEE_INFO = 990;
	/** Intent key ident: 收货信息Activity回调时Intent中存放收信息DTO对象的KEY标识 */
	public final static String INTENT_KEY_EXTRA_CONSIGNEE$INFO$DTO = "__consignee$info$dto__";
	
	/** 按钮组件：生成订单 */
	private Button btnGenSO = null;
//	/** 按钮组件：生成订单并支付 */
//	private Button btnGenSOAndPay = null;
	
	/** UI逻辑子类：收货人信息包装实现类 */
	private OrderComfirmGoodRecieverWrapper goodRecieverWrapper = null;
	/** UI逻辑子类：物流信息包装实现类 */
	private OrderComfirmTransferFareWrapper transferFareWrapper = null;
	/** UI逻辑子类：商品明细列表包装实现类 */
	private OrderComfirmGoodsListWrapper goodsListWrapper = null;
	/** UI逻辑子类：金额合计等包装实现类 */
	private OrderComfirmAmountWrapper orderComfirmAmountWrapper = null;
	
	private SO needPaySo;
	
	/** 
	 * 初始化界面组件.
	 * {@inheritDoc}
	 */
	@Override
	protected void initViews(Bundle savedInstanceState)
	{
		// 设定自定义标题栏（设定此值即意味着开启自定义标题栏的使用，必须要在setContentView前设定）
		customeTitleBarResId = R.id.common_mall_shop_layout_order_confirm_titleBar;
		// 养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
		setContentView(R.layout.common_mall_shop_layout_order_confirm);
//		//对自定义标题栏中的组件进行设定
//		this.getCustomeTitleBar().getRightGeneralButton().setVisibility(View.VISIBLE);
//		this.getCustomeTitleBar().getRightGeneralButton().setText("");
//		this.getCustomeTitleBar().getRightGeneralButton().setBackgroundResource(R.drawable.common_mall_shop_shopping_btn);
		
		// 初始化各种组件
		btnGenSO = (Button)findViewById(R.id.common_mall_shop_layout_order_confirm_genSOBtn);
//		btnGenSOAndPay = (Button)findViewById(R.id.common_mall_shop_layout_order_confirm_genSOAndPayBtn);
		
		// 设置标题
		this.setTitle(R.string.common_mall_shop_order_confirm_title);
		//
		this.setLoadDataOnCreate(false);
		
//		// 根据Intent中传过来的U友信息数据，刷新UI界面显示
//		this.refreshToView(goodInfoForInit);
		
		//
		orderComfirmAmountWrapper = new OrderComfirmAmountWrapper(this);
		goodRecieverWrapper = new OrderComfirmGoodRecieverWrapper(this);
		transferFareWrapper = new OrderComfirmTransferFareWrapper(this){
			@Override
			protected void transferFareOnChaned(double fareAmount)
			{
				orderComfirmAmountWrapper.refreshTransferFare(fareAmount);
			}
		};
		// TODO 目前为了节省开发时间程序里的物流是写死的，以后要从数据库表sales_trsfer_for_country中按国家读取。
		transferFareWrapper.setTransferFare(new OrderComfirmTransferFareWrapper.__TransferFare("1", "UPS DHL FedEx", 35.00)); // "1"是目前存放在数据库中的UPS物流的ID
		goodsListWrapper = new OrderComfirmGoodsListWrapper(this){
			@Override
			protected void listDataOnChanged(double goodsAmount)
			{
				orderComfirmAmountWrapper.refreshGoodsAmount(goodsAmount);
			}
		};
	}
	
	@Override
	protected void initListeners()
	{
		btnGenSO.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v)
			{
				// 当用户没用登陆时作未登陆的处理
				if(!MallGlobal.getMallProviderInstance(OrderComfirmActivity.this).getRobotimeMall().isUserLogin())
					MallGlobal.getMallProviderInstance(OrderComfirmActivity.this).getRobotimeMall().processForUserUnLogin(OrderComfirmActivity.this);
				else
				{
					if(!goodsListWrapper.isValid())
					{
						WidgetUtils.showToast(OrderComfirmActivity.this, R.string.common_mall_shop_order_confirm_good_list_validate, ToastType.INFO);
						return;
					}
					if(!goodRecieverWrapper.isValid())
					{
//						WidgetUtils.showToast(OrderComfirmActivity.this, R.string.common_mall_shop_order_confirm_good_reciever_validate, ToastType.INFO);
						goodRecieverWrapper.getEditAddressBtn().performClick();
						return;
					}
					if(!transferFareWrapper.isValid())
					{
						WidgetUtils.showToast(OrderComfirmActivity.this, R.string.common_mall_shop_order_confirm_transfer_fare_validate, ToastType.INFO);
						return;
					}

					//
					new DataAsyncTask().execute();
				}
			}
		});
		
//		btnGenSOAndPay.setOnClickListener(new OnClickListener(){
//			@Override
//			public void onClick(View v)
//			{
//				isPay = true;
//				new DataAsyncTask().execute();
//				// TODO （第1步）插入一条新的销售订单到数据库中
//				// TODO （第2步）订单生成成功后就清空购物车
//				// TODO （第3步）清空完购物车后就finish()当前并跳转到“PayPal支付界面”
//			}
//		});
//		this.getCustomeTitleBar().getRightGeneralButton().setOnClickListener(new OnClickListener(){
//			@Override
//			public void onClick(View v)
//			{
//				startActivity(IntentFactory.createShopCarActivityIntent(OrderComfirmActivity.this));
//			}
//		});
	}
	
//	// 去掉EVA通用类中的默认“返回”菜单项
//	public boolean onCreateOptionsMenu(Menu menu)
//	{
//		return false;
//	}
	
	/**
	 * 获取本界面中的销售订单数据.
	 * 
	 * @return
	 */
	// TODO “日期”、“订单编号”在服务端生成即可！！！！！！！！！！！！！！！！！！！！！
	private SO getFormData()
	{
		SO so = new SO();
		
		// 默认状态是“已下单未付款”
		so.setOrder_status("0");
		// 货币类型目前只支持“美元”
		so.setOrder_currency(Utility.DEFAULT_CURRENCY_TYPE);
		// 商品明细
		so.setSoDetails(goodsListWrapper.getSODetail());
		// 收货信息
		so.setSoConsigneeInfo(goodRecieverWrapper.getConsigneeInfo());
		// 支付类型：目前只支付PayPal支付（数据库中定义的PayPal支付方式的常量就是0）
		so.setPay_type("0");
		
		// 用户Uid
		so.setFor_user_uid(MallGlobal.getMallProviderInstance(this).getRobotimeMall().getLoginedUserUid());
		// 本APP中当然是"已注册"用户提交的订单
		so.setOrder_type("1");
		
		// 物流id
		so.setTransfer_id(transferFareWrapper.getTransferFare().getTransferId());
		
		// 物流费用
		so.setFare_amount(String.valueOf(transferFareWrapper.getTransferFare().getFareAmount()));
		// 商品总额（不含运费）
		so.setOrder_amount(String.valueOf(goodsListWrapper.getGoodsAmount()));
		// 订单实付总金额（已加上运费后）
		so.setOrder_total(orderComfirmAmountWrapper.getTotalAmount());

		return so;
	}
	
	//--------------------------------------------------------------------------------------------
	/**
	 * 从服务端查询数据并返回.
	 * 
	 * @param params loadData中传进来的参数，本类中该参数没有被用到
	 */
	@Override protected DataFromServer queryData(String... params)
	{
		return null;
	}
	//将已构造完成的完整的明细数据放入列表中显示出来
	@Override protected void refreshToView(Object dateToView)
	{
		//
	}
	
	/**
	 * 处理回调.
	 * {@inheritDoc}
	 */
	public void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		// 处理收货信息的回调
		goodRecieverWrapper.processParentOnActivityResult(requestCode, resultCode, data);
	}
	
	/**
	 * 提交数据请求和处理的异步执行线程实现类.
	 */
	protected class DataAsyncTask extends DataLoadingAsyncTask<String, Integer, DataFromServer>
	{
		public DataAsyncTask()
		{
			super(OrderComfirmActivity.this, $$(R.string.common_mall_shop_order_confirm_submit_data));
		}

		/**
		 * 在后台执行 {@link doLogin()}实现登陆信息的提交和处于结果的读取 .
		 * 
		 * @param parems
		 *            外界传进来的参数
		 * @return 查询结果，将传递给onPostExecute(..)方法
		 */
		@Override
		protected DataFromServer doInBackground(String... params)
		{
			needPaySo = getFormData();
			// 要发送给服务端的对象
			return MallGlobal.getMallProviderInstance(context).getRobotimeMall().getAuthedService().sendObjToServer(
					DataFromClient.n().setProcessorId(CommonProcessorConst.PROCESSOR_SHOP_NEED$AUTHED)
							.setJobDispatchId(JobDispatchConst.SHOP_GOODS_MGR_NEED$AUTHED)
							.setActionId(SysActionConst.ACTION_NEW)
							.setNewData(needPaySo));
		}

		/**
		 * 处理服务端返回的登陆结果信息.
		 * 
		 * @see AutoUpdateDaemon
		 * @see #needSaveDefaultLoginName()
		 * @see #afterLoginSucess()
		 */
		protected void onPostExecuteImpl(Object result)
		{
			int resId;
			// 服务端的返回值对象
			if (result != null)
			{
				SO so = (SO)result;
				resId = R.string.common_mall_shop_order_confirm_submit_success;
				// 订单生成成功后就清空购物车
				MallGlobal.getMallProviderInstance(context).getRobotimeMall().getShopCarProvider().clearCar();
				
				// 清空完购物车后就finish()当前并跳转到“订单管理界面”
				Intent intent = new Intent(OrderComfirmActivity.this, OrderConfirmResultActivity.class);
				intent.putExtra("SO", so);
				startActivity(intent);
				finish();
			}
			else
			{
				resId = R.string.common_mall_shop_order_confirm_submit_failure;
			}
			Toast.makeText(OrderComfirmActivity.this, resId, Toast.LENGTH_LONG).show();
		}
	}
}
